package com.szl.group.common.anno;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * 幂等概念：
 * 订单接口, 不能多次创建订单
 * 支付接口, 重复支付同一笔订单只能扣一次钱
 * 支付宝回调接口, 可能会多次回调, 必须处理重复回调
 * 普通表单提交接口, 因为网络超时等原因多次点击提交, 只能成功一次等等
 * <p>
 * 实现方法：
 * 唯一索引 -- 防止新增脏数据
 * token机制 -- 防止页面重复提交
 * 悲观锁 -- 获取数据的时候加锁(锁表或锁行)
 * 乐观锁 -- 基于版本号version实现, 在更新数据那一刻校验数据
 * 分布式锁 -- redis(jedis、redisson)或zookeeper实现
 * 状态机 -- 状态变更, 更新数据时判断状态
 * <p>
 * author shenxiaolong
 * date 2020-07-07
 */

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Idempotent {

    /**
     * key前缀
     */
    String prefix() default "";

    /**
     * 过期秒数,默认为5秒
     */
    int expire() default 5;

    /**
     * 超时时间单位，默认为秒
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /**
     * Key的分隔符（默认 :）
     */
    String delimiter() default ":";
}
